package com.example.apidocserver.infrastructure.util.file;

import com.alibaba.druid.util.StringUtils;
import com.example.apidocserver.infrastructure.util.result.ParamException;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.http.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URLEncoder;

/**
 * 上传下载工具类
 *
 * @author xyqlg
 */
public class LoadUtils {
    /**
     * 校验输入文件流名称
     *
     * @param file       文件对象
     * @param fileTypeIn 文件类型
     */
    public static void checkFileName(MultipartFile file, String fileTypeIn) {
        if (file.isEmpty()) {
            throw new ParamException("上传文件不能为空。");
        }
        String fileName = file.getOriginalFilename();
        if (StringUtils.isEmpty(fileName)) {
            throw new ParamException("上传文档格式不正确。");
        }
        String fileType = fileName.substring(fileName.lastIndexOf(".") + 1);
        if (!fileTypeIn.equalsIgnoreCase(fileType)) {
            throw new ParamException("上传文件格式不正确，只能上传：" + fileTypeIn);
        }
    }

    /**
     * 获取下载文档entity对象
     *
     * @param document 文档对象
     * @param filename 下载文档名称
     * @return 返回对象entity
     * @throws IOException io错误
     */
    public static ResponseEntity<byte[]> getDownEntity(XWPFDocument document, String filename) throws IOException {
        HttpHeaders headers = new HttpHeaders();
        String encodedFilename = URLEncoder.encode(filename, "UTF-8");
        headers.add("filename", encodedFilename);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        document.write(outputStream);
        document.close();
        byte[] bytes = outputStream.toByteArray();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        headers.setContentDisposition(ContentDisposition.attachment().filename(filename).build());
        return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
    }
}
